Comparable & Comparator(Interface)

    Comparable
Comparable interface는 자기 자신과 전달받은 매개변수를 비교한다.
Comparable interface에는 compareTo 추상 메서드가 포함되어 있다.
package collection;
// implements Comparable
public class Member implements Comparable<Member>{
private int memberId;
private String memberName;
public Member(int memberId, String memberName) {
this.memberId=memberId;
this.memberName=memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId=memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName=memberName;
}
@Override
public String toString() {
return memberName+" "+memberId+" .";
}
@Override
public int hashCode(){
return memberId;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Member){
Member member=(Member) obj;
if(this.memberId==member.memberId)return true;
else return false;
}
return false;
}
//re-define(Override) compareTo methods
@Override
public int compareTo(Member member){
return (this.memberId-member.memberId);
}
}
위 코드의 compareTo 메서드에서
this.memberId는 새로 추가된 회원의 아이디를 나타내고
member.memberId는 비교하기 위해서 compareTo 메서드에 전달된 회원 아이디이다.

this.memberId>member.memberId 일 때 compareTo 메서드 return 값이 양수이면
오름차순으로 정렬 된다.
@Override
public int compareTo(Member member){
return (this.memberId-member.memberId)*(-1);
}
위와 같이 compareTo 메서드를 정의할 시,
내림차순으로 정렬된다.
    Comparator
Compaator interface는 자기 자신과 전달받은 매개변수를 비교한다.(same as Comparable)
Comparable interface에는 compare 추상 메서드가 포함되어 있다.

compare 메서드는 compareTo 메서드와 달리 두개의 매개변수를 전달 받는다.
compareTo 메서드는 this와 전달된 매개변수를 비교하였다면,
compare 메서드는 전달받은 2개의 매개변수를 비교한다.
package collection;
// need to import Comparator class
import java.util.Comparator;
// implements Comparator
public class Member2 implements Comparator<Member2> {
private int memberId;
private String memberName;
public Member2(int memberId, String memberName){
this.memberId=memberId;
this.memberName=memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId=memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName=memberName;
}
@Override
public String toString() {
return memberName+" "+memberId+" .";
}
@Override
public int hashCode(){
return memberId;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Member){
Member member=(Member) obj;
if(this.memberId==member.memberId)return true;
else return false;
}
return false;
}
//re-define(Override) compare methods
@Override
public int compare(Member2 mem1,Member2 mem2) {
return mem1.getMemberId()-mem2.getMemberId();
}
}
첫 번째 매개변수가 더 클 때 양수를 반환하면,
오름차순으로 정렬된다.
ComparatorTest.java
package collection.treeset;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
class MyCompare implements Comparator<String>{
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2))*(-1);
}
}
public class ComparatorTest {
public static void main(String[] args) {
// TreeSet Comparator
Set<String> set=new TreeSet<String>(new MyCompare());
set.add("aaa");
set.add("ccc");
set.add("bbb");
System.out.println(set);
}
}

[ccc, bbb, aaa]

일반적으로 Comparable Interface를 더 많이 사용하지만 Comparable Interface를 이미 구현한 경우,
Comparator Interface를 사용한다.

Ex>
String class의 경우 final로 Comparable Interface를 오름차순으로 이미 구현해 두었다.
이를 내림차순으로 바꾸고 싶은 경우에는 Comparator를 사용한다.